#include <iostream>

// 模板方法模式（有纯虚函数的支持才能实现）
// 做热饮：结果不一样，但流程一样
class Drink
{  
public:
    // 烧水
    virtual void Boil() = 0;
    // 放入原料
    virtual void Brew() = 0;
    // 搅拌
    virtual void Pour() = 0;
    // 虽然不知道烧什么水、放什么原料、怎么搅拌，但操作流程是确定的
    void MakeDrink()
    {
        Boil();
        Brew();
        Pour();
    }
};

// 基类有多个纯虚函数
// 子类必须实现所有的纯虚函数，才能实例化对象
class MilkTea:public Drink
{
public:
    void Boil()
    {
        std::cout<<"热牛奶"<<std::endl;
    }

    void Brew()
    {
        std::cout<<"倒入珍珠"<<std::endl;
    }

    void Pour()
    {
        std::cout<<"用吸管搅拌"<<std::endl;
    }
};

class Coffee:public Drink
{
public:
    void Boil()
    {
        std::cout<<"烧矿泉水"<<std::endl;
    }

    void Brew()
    {
        std::cout<<"倒入咖啡粉"<<std::endl;
    }

    void Pour()
    {
        std::cout<<"用勺子搅拌"<<std::endl;
    }
};

int main()
{
    Drink *d = new MilkTea;
    d = new Coffee;
    d->MakeDrink();
    return 0;
}
